#!/bin/bash

# Redis 服务器地址和端口
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"

# 测试的配置
PING_COUNT=3  # 发送的 PING 命令数量
TEST_COUNT=10  # 重复测试的次数

# 初始化总时间和成功响应计数器
total_time=0
success_count=0

# 测试函数
test_ping_mbULK() {
    local times=$1

    # 发送PING_MBULK命令并测量时间
    for ((j=0; j<times; j++)); do
        start_time_ns=$(date +%s%3N)  # 获取当前时间纳秒
        # 使用seq和awk生成ping命令，并通过管道发送给redis-cli
        redis_response=$(seq 1 $times | awk '{printf "ping\n"}' | redis-cli -h $REDIS_HOST -p $REDIS_PORT --pipe)
        end_time_ns=$(date +%s%3N)    # 获取当前时间纳秒

        # 提取错误和回复数量
        errors=$(echo "$redis_response" | grep -o 'errors: [0-9]*' | grep -o '[0-9]*')
        replies=$(echo "$redis_response" | grep -o 'replies: [0-9]*' | grep -o '[0-9]*')

        # 检查redis-cli是否成功执行
        if [[ $errors -eq 0 && $replies -eq $times ]]; then
            # 计算命令执行时间（纳秒）
            let "diff_time_ns=(end_time_ns - start_time_ns)"
            let "total_time+=diff_time_ns"
            (( success_count++ ))
        else
            echo "Test failed: errors=$errors, replies=$replies, expected replies=$times"
        fi
    done

    # 计算平均命令执行时间（纳秒）
    if [[ $success_count -gt 0 ]]; then
        avg_time_ns=$((total_time / success_count))
    else
        avg_time_ns=0
    fi

    # 将纳秒转换为微秒
    avg_time_us=$(echo "scale=3; $avg_time_ns/1000" | bc)

    # 计算吞吐量（每秒处理的命令数）
    throughput=$(echo "scale=2; ($success_count*1000000)/$total_time" | bc)

    # 输出结果
    echo "Average latency: $avg_time_us microseconds"
    echo "Throughput: $(echo "scale=2; $throughput" | bc) commands per second"
}

# 执行测试
test_ping_mbULK $PING_COUNT
